/* 
 * GrupoInsertUpdateRule.java
 * 
 * Data de criação: 09/09/2010
 * 
 * O2SOLUTIONS - SOLUÇÕES EM TECNOLOGIA DA INFORMAÇÃO. 
 *
 */
package br.com.o2solutions.siso.business.rule.grupo.evento;

import java.util.List;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import br.com.o2solutions.core.exception.BusinessException;
import br.com.o2solutions.core.integration.repository.DataBaseIntegration;
import br.com.o2solutions.siso.integration.entidade.GrupoEvento;
import br.com.o2solutions.util.assertion.Assert;
import br.com.o2solutions.util.collection.CollectionUtil;

/**
 * Classe responsável por verificar se o {@link GrupoEvento} a ser modificado ou
 * persistido está duplicando na base de dados a descrição.
 * 
 * @author Osvaldeir
 * @since 09/09/2010
 * 
 */
@Component("grupoEventoInsertUpdateRule")
public class GrupoEventoInsertUpdateRule implements
		br.com.o2solutions.core.service.rule.Rule<GrupoEvento> {

	@Value("#{grupoEventoDAO}")
	private DataBaseIntegration<GrupoEvento> grupoEventoDAO;

	/**
	 * {@inheritDoc}
	 * 
	 * <p>
	 * O cadastro de Grupo com a mesma descrição é considerado uma quebra
	 * negocial, assim , será lançada uma {@link BusinessException} com a chave
	 * <b>error.grupo.exists</b> informando a existência do Grupo na base de
	 * dados.
	 */
	@Override
	public void check(GrupoEvento entity) throws BusinessException {
		List<GrupoEvento> loaded = grupoEventoDAO.findByNamedQuery(
				"GrupoEvento.findByDescricao", entity.getDescricao());
		loaded.remove(entity);
		Assert.isTrue(CollectionUtil.isEmpty(loaded),
				new BusinessException("Grupo já cadastrado",
						"error.grupo.exists", entity.getDescricao()));

	}

}
